#!/usr/bin/env python
# encoding: utf-8
'''
@author: Excelsiorly
@license: (C) Copyright 2022, All Rights Reserved.
@contact: excelsiorly@qq.com
@file: 221. 最大正方形.py
@time: 2022/3/2 15:19
@desc: https://leetcode-cn.com/problems/maximal-square/
> 在一个由 '0' 和 '1' 组成的二维矩阵内，找到只包含 '1' 的最大正方形，并返回其面积。

1. dp, dp[i][j]为以(i, j)为右下角的正方形的最大边长，然后记录最大值，返回结果的平方
'''
class Solution:
    def maximalSquare(self, matrix) -> int:
        if len(matrix) == 0 or len(matrix[0]) == 0:
            return 0

        ans = 0
        m, n = len(matrix), len(matrix[0])
        # dp为以(i, j)为右下角的正方形的最大边长
        dp = [[0] * (n) for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if matrix[i][j] == '1':
                    if i == 0 or j == 0:
                        dp[i][j] = 1
                    else:
                        dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
                    ans = max(ans, dp[i][j])
        return ans ** 2

